package com.hospital.hms.service.impl;

import cn.hutool.core.map.MapUtil;
import com.hospital.hms.dao.MedicalDeptDao;
import com.hospital.hms.exception.GlobalException;
import com.hospital.hms.pojo.MedicalDept;
import com.hospital.hms.service.MedicalDeptService;
import com.hospital.hms.utils.PageUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class MedicalDeptServiceImpl implements MedicalDeptService {

    @Autowired
    MedicalDeptDao medicalDeptDao;
    @Override
    public ArrayList<HashMap> selectAll() {
        return medicalDeptDao.selectAll();
    }

    @Override
    public HashMap selectDeptAndSub() {
        ArrayList<HashMap> list = medicalDeptDao.selectDeptAndSub();
        LinkedHashMap<String, ArrayList> linkedHashMap = new LinkedHashMap<String, ArrayList>();
//        遍历科室和对应的门诊数据
        for (HashMap<String, Object> instance : list) {
            Integer subId = (Integer) instance.get("subId");  //获取门诊id
            String deptName = (String) instance.get("deptName"); //获取科室部门名称
            String subName = (String) instance.get("subName"); //获取门诊名称
            /*
            * 将门诊信息添加到对应科室部门列表中，然后返回给前端展示
            * */
//            computeIfAbsent:
//            如果Map中存在指定的key，那么不会执行任何操作，直接返回该键值对对应的值，然后添加元素
//           例如：
//            Map<String, List<Integer>> map = new HashMap<>();
////            如果“key”不存在，则插件一个新的列表，并将其与这个键值所对应，关联
//            map.computeIfAbsent("key",k -> new ArrayList<>()).add(1);
////            如果“key"存在，则直接返回现有的键值，并向其添加元素
//            map.computeIfAbsent("key",k->new ArrayList<>()).add(2);
//            System.out.println(map); // 输出：{key=[1, 2]}

            /*
            * 第二次遍历时，就不会创建新的列表，而是直接返回已存在的列表，并向其添加元素
            * */
            linkedHashMap.computeIfAbsent(deptName,k->new ArrayList<>())
                    .add(new HashMap<>(){{
                        put("subId",subId);
                        put("subName",subName);
                    }});
        }
        return linkedHashMap;
    }

    @Override
    public PageUtils selectConditionByPage(Map map) {
        ArrayList<HashMap> list = null;
        long count = medicalDeptDao.selectConditionByPageCount(map);
        if (count!=0) {
            list = medicalDeptDao.selectConditionByPage(map);
        }else {
            list = new ArrayList<>();
        }
        int page = MapUtil.getInt(map,"page");
        Integer length = MapUtil.getInt(map, "length");
        PageUtils pageUtils = new PageUtils(list,count,page,length);
        return pageUtils;
    }

    @Override
    public ArrayList<HashMap> selectAllDeptNameAndId() {
        return medicalDeptDao.selectAllDeptNameAndId();
    }

    @Override
    public void insert(MedicalDept medicalDept) {
        medicalDeptDao.insert(medicalDept);
    }

    @Override
    public HashMap selectById(int id) {
        return medicalDeptDao.selectById(id);
    }

    @Override
    public void update(MedicalDept medicalDept) {
        medicalDeptDao.update(medicalDept);
    }

    @Override
    public void deleteByIds(Integer[] ids) {
        long count = medicalDeptDao.selectSubCountByIds(ids);
        if (count == 0) {
            medicalDeptDao.deleteByIds(ids);
        }else {
            throw new GlobalException("科室存在关联诊室，无法删除!");
        }
    }

    @Override
    public ArrayList<HashMap> selectMedicalDeptList(Map param) {
        return medicalDeptDao.selectMedicalDeptList(param);
    }
}
